home *** CD-ROM | disk | FTP | other *** search
- ;**************************************************************
- ;
- ; $lms.asm
- ;
- ; staff
- ;
- ; 03-26-88
- ;
- ; (C) Texas Instruments Inc., 1992
- ;
- ; Refer to the file 'license.txt' included with this
- ; this package for usage and license information.
- ;
- ;**************************************************************
- Example 33. Adaptive FIR filter (LMS algorithm)
- ;
- ;==============================================================================
- ; SUBROUTINE L M S
- ;==============================================================================
- ; LMS == LMS ADAPTIVE FILTER
- ;
- ;
- ;
- ; EQUATIONS: y(n) = h(n,0)*x(n) + h(n,1)*x(n-1) + ... + h(n,N-1)*x(n-(N-1))
- ; for (i = 0; i < N; i++)
- ; h(n+1,i) = h(n,i) + tmuerr * x(n-i)
- ;
- ; TYPICAL CALLING SEQUENCE:
- ;
- ; load R4
- ; load AR0
- ; load AR1
- ; load RC
- ; load BK
- ; CALL FIR
- ;
- ;
- ; ARGUMENT ASSIGNMENTS:
- ; argument | function
- ; ---------+-----------------------
- ; R4 | scale factor (2 * mu * err)
- ; AR0 | address of h(n,N-1)
- ; AR1 | address of x(n-(N-1))
- ; RC | length of filter - 2 (N-2)
- ; BK | length of filter (N)
- ;
- ; REGISTERS USED AS INPUT: R4, AR0, AR1, RC, BK
- ; REGISTERS MODIFIED: R0, R1, R2, AR0, AR1, RC
- ; REGISTER CONTAINING RESULT: R0
- ;
- ; PROGRAM SIZE: 10 words
- ;
- ; EXECUTION CYCLES: 12 + 3(N-1)
- ;
- ;==============================================================================
- ;
- ; setup (i = 0)
- ;
- .global LMS
- ; ; initialize R0:
- LMS MPYF3 *AR0, *AR1, R0 ; h(n,N-1) * x(n-(N-1)) -> R0
- LDF 0.0,R2 ; initialize R2.
- ;
- ; ; initialize R1:
- MPYF3 *AR1++(1)%,R4,R1 ; x(n-(N-1)) * tmuerr -> R1
- ADDF3 *AR0++(1),R1,R1 ; h(n,N-1) + x(n-(N-1)) * tmuerr -> R1
- ;
- ; filter and update ( 1 <= i < N)
- ;
- RPTB LOOP ; setup the repeat block.
- ;
- ; ; filter:
- MPYF3 *AR0--(1),*AR1,R0 ; h(n,N-1-i) * x(n-(N-1-i)) -> R0
- || ADDF3 R0,R2,R2 ; multiply and add operation.
- ;
- ; ; update:
- MPYF3 *AR1++(1)%,R4,R1 ; x(n-(N-1-i)) * tmuerr -> R1
- || STF R1, *AR0++(1) ; R1 -> h(n+1,N-1-(i-1))
- ;
- LOOP ADDF3 *AR0++(1),R1,R1 ; h(n,N-1-i) + x(n-(N-1-i))*tmuerr -> R1
- ;
- ADDF3 R0,R2,R0 ; add last product.
- STF R1,*-AR0(1) ; h(n,0) + x(n) * tmuerr -> h(n+1,0)
- ;
- ; return sequence
- ;
- RETS ; return
- ;
- ; end
- ;
- .end